module rd1 #(
    parameter
        FRAME_ROW      = 16'd480,    // 一帧的行数
        FRAME_LINE     = 16'd640,    // 一帧的列数，16bit为一个单位
        RD1_BURST_LEN  = 16'd160,    // wr0_fifo一次突发要突发的长度，
        RD1_THRESHOLD  = 16'd160,    // wr0驱动ddr写的阈值——1行数据
        RD1_BEGIN_ADDR = 25'd614400
)(
    input                   clk                 ,
    input                   rst_n               ,
    // fifo 接口
    input                   rd1_wr_clk          ,
    input                   rd1_rd_clk          ,
    input                   rd1_rd_en           ,
    output      [127:0]     rd1_128bit_dout     ,
    output      [  8:0]     rd1_9bit_rd_cnt     ,
    // ddr3 接口
    input                   output_fifo_wr_en   , // 输出fifo写入使能
    input       [127:0]     rd_data             , // ddr 读取的数据，接输出fifo
    input                   rd_done             , // 一次写完成标志
    output reg  [ 24:0]     begin_addr          , // ddr 读写开始地址
    output                  rw                  , // ddr 读写标志，1读 0写
    output      [ 15:0]     burst_data_len      , // 突发长度
    output reg              exc                   // 执行标志
);
// 参数定义-------------------------
reg  [ 15:0] row_cnt;
wire [127:0] rd1_128bit_din;
wire         rd1_wr_en;
// 前置操作-------------------------
// 已读取的行，行计数
always @(posedge clk or negedge rst_n) begin
    if(~rst_n)
        row_cnt <= 16'd0;
    else if((row_cnt == FRAME_ROW - 16'd1) && rd_done)             // 写满了一帧，计数复位
        row_cnt <= 16'd0;
    else if(rd_done)
        row_cnt <= row_cnt + 16'd1;
    else
        row_cnt <= row_cnt;
end

// 信号输出-------------------------

// rd_data
assign rd1_128bit_din = rd_data;

// begin_addr
always @(posedge clk or negedge rst_n) begin
    if(~rst_n)
        begin_addr <= RD1_BEGIN_ADDR;
    else if(rd_done && (row_cnt == FRAME_ROW - 16'd1)) // 写满了一帧，地址复位
        begin_addr <= RD1_BEGIN_ADDR;
    else if(rd_done)           
        begin_addr <= begin_addr + (FRAME_LINE << 1);
    else 
        begin_addr <= begin_addr;
end

// rw
assign rw               = 1'd1;           // 读操作

// burst_data_len
assign burst_data_len   = RD1_BURST_LEN;  

// exc
always @(posedge clk or negedge rst_n) begin
    if(~rst_n)
        exc <= 1'd0;
    else if(rd1_9bit_rd_cnt < RD1_THRESHOLD)
        exc <= 1'd1;
    else 
        exc <= 1'd0;
end

// rd1_fifo-------------------------
assign rd1_wr_en = output_fifo_wr_en;

rd1_fifo_512x128_512x128 u_rd1_fifo (
  .rst              (~rst_n         ),      // input wire rst
  .wr_clk           (rd1_wr_clk     ),      // input wire wr_clk
  .rd_clk           (rd1_rd_clk     ),      // input wire rd_clk
  .din              (rd1_128bit_din ),      // input wire [127 : 0] din
  .wr_en            (rd1_wr_en      ),      // input wire wr_en
  .rd_en            (rd1_rd_en      ),      // input wire rd_en
  .dout             (rd1_128bit_dout),      // output wire [127 : 0] dout
  .full             (),                     // output wire full
  .empty            (),                     // output wire empty
  .rd_data_count    (rd1_9bit_rd_cnt),      // output wire [8 : 0] rd_data_count
  .wr_rst_busy      (),                     // output wire wr_rst_busy
  .rd_rst_busy      ()                      // output wire rd_rst_busy
);
endmodule